/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.AnalisadorSintatico;


import compilador.AnalisadorLexico.Atomo;
import compilador.AnalisadorSemantico.GeracaoDeCodigo.TiposAS;
import java.util.LinkedList;
import java.util.Queue;

/**
 *
 * @author Leles
 */
public class SM_CMD_Switch extends SubMaquina {

    private enum Estados {
        ESPERA_SWITCH, ESPERA_ABRE_PAR, ESPERA_ID, ESPERA_FECHA_PAR, 
        ESPERA_CASE_OU_BREAK_OU_END, ESPERA_CONST_OU_NUM,ESPERA_DOISPONTOS, ESPERA_LISTACMD,
        ESPERA_PONTOEVIRGULA_DOBREAK,
        ESPERA_SWITCH_FIM,
        ACEITA
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    };
    
    public Queue <String> Cases;
    public String SwitchVar;
    
    
    SM_CMD_Switch() {
        estadoInicial = Estados.ESPERA_SWITCH.ordinal();
        estadoFinal = Estados.ACEITA.ordinal();
        
        Cases = new LinkedList<String> ();
        
        defineTabelaTransicao();    
    }
    
    
    private void defineTabelaTransicao (){
        /* Tabela com as Transicao
         * A maior parte das posicoes de memoria sao vazias
         * Funciona assim:  o primeiro indice indica o ESTADO ATUAL
         *                  o segundo  indice indica o ATOMO LIDO
         * Transicao DE SUBMAQUINA:
         * também passam um estado, o estado da volta
         * Ele é chamado na funcao, depois do retorno da submaquina
         * assim não é necessaria uma pilha explicita
         */
        
        numEstados = Estados.class.getEnumConstants().length;
        numAtomos = Atomo.TokenType.class.getEnumConstants().length;
        
        Tabela_Decisao = new Transicao [numEstados][numAtomos];
        
        // Transicao SUB MAQUINA SWITCH
        Tabela_Decisao 
                [Estados.ESPERA_SWITCH.ordinal()]
                [Atomo.TokenType.SWITCH.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_ABRE_PAR.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
        
        Tabela_Decisao 
                [Estados.ESPERA_ABRE_PAR.ordinal()]
                [Atomo.TokenType.PARENTESES_ABRE.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_ID.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
        Tabela_Decisao 
                [Estados.ESPERA_ID.ordinal()]
                [Atomo.TokenType.ID.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_FECHA_PAR.ordinal(), 
                                null,
                                TiposAS.SWITCH_INICIO  );
        Tabela_Decisao 
                [Estados.ESPERA_FECHA_PAR.ordinal()]
                [Atomo.TokenType.PARENTESES_FECHA.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
        
        
        
        
        
        
        Tabela_Decisao 
                [Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal()]
                [Atomo.TokenType.CASE.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_CONST_OU_NUM.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
        Tabela_Decisao 
                [Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal()]
                [Atomo.TokenType.END.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_SWITCH_FIM.ordinal(), 
                                null,
                                TiposAS.SWITCH_FIM  );
        Tabela_Decisao 
                [Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal()]
                [Atomo.TokenType.BREAK.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_PONTOEVIRGULA_DOBREAK.ordinal(), 
                                null,
                                TiposAS.SWITCH_BREAK );
        Tabela_Decisao 
                [Estados.ESPERA_PONTOEVIRGULA_DOBREAK.ordinal()]
                [Atomo.TokenType.PONTOEVIRGULA.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA );
        
        
        
        
        
        Tabela_Decisao 
                [Estados.ESPERA_CONST_OU_NUM.ordinal()]
                [Atomo.TokenType.NUMERO.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_DOISPONTOS.ordinal(), 
                                null,
                                TiposAS.SWITCH_CASE  );
        Tabela_Decisao 
                [Estados.ESPERA_DOISPONTOS.ordinal()]
                [Atomo.TokenType.DOISPOINTOS.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ESPERA_LISTACMD.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
        
        
        Tabela_Decisao 
                [Estados.ESPERA_LISTACMD.ordinal()]
                [Atomo.TokenType.TRANSICAO_VAZIA.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.SubMaquina, 
                                Estados.ESPERA_CASE_OU_BREAK_OU_END.ordinal(), 
                                SM_Comandos.class,
                                TiposAS.ACAO_NENHUMA  );
        
        
        
        
        Tabela_Decisao 
                [Estados.ESPERA_SWITCH_FIM.ordinal()]
                [Atomo.TokenType.SWITCH.ordinal()] =
                new Transicao ( Transicao.TipoTransicao.Estado, 
                                Estados.ACEITA.ordinal(), 
                                null,
                                TiposAS.ACAO_NENHUMA  );
                
        
  
    }        

    
    
}
